/**
 * 
 */
package edu.acatlan.unam.client.ui;

//Librerías de la clase
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.PushButton;

//Librerías del proyecto
import edu.acatlan.unam.client.ui.controlador.editorTabla.ITablaColumna;
import edu.acatlan.unam.shared.bdoo.TColumna;

/**
 * @author jacobo
 * 
 * Esta clase genera el editor de la tabla seleccionada.
 */
public class TablaColumnas extends FlexTable implements ClickHandler, KeyPressHandler {
	//propiedades de la clase
	private MultiWordSuggestOracle oraculo;
	private ITablaColumna controlador;
	
	/**
	 * Constructor de la clase
	 */
	public TablaColumnas(ITablaColumna c) {
		controlador = c;
		setStyleName("formulario-tabla");
		this.setCellSpacing(2);
		this.setCellPadding(2);
		
		colocarEtiquetas();
		
		oraculo = new MultiWordSuggestOracle();
		oraculo.add("int");
		oraculo.add("char");
		oraculo.add("varchar()");
		oraculo.add("date");
		oraculo.add("float");
	}
	
	/**
	 * Esta función coloca las etiquetas de las columnas de la tabla
	 */
	private void colocarEtiquetas() {
		this.setWidget(0, 0, new Label("Eliminar"));
		this.setWidget(0, 1, new Label("Nombre columna"));
		this.setWidget(0, 2, new Label("Tipo de dato"));
		this.setWidget(0, 3, new Label("PK"));
		this.setWidget(0, 4, new Label("Permite Nulo"));
		this.setWidget(0, 5, new Label("Es único"));
		this.setWidget(0, 6, new Label("Es índice"));
		this.setWidget(0, 7, new Label("Valor por defecto"));
	}
	
	/**
	 * Agrega los controles al último renglón de la tabla.
	 */
	private void agregarUltimosControles() {
		PushButton btnEliminar = new PushButton(new Image("/img/Minus Red Button.png"));
		btnEliminar.setSize("32px", "32px");
		btnEliminar.setTitle("Eliminar columna");
		
		TextBox txtNombre = new TextBox();
		TextBox txtValDefct = new TextBox();
		
		SuggestBox txtTipoDato = new SuggestBox(oraculo);
		CheckBox chkConstrains[] = new CheckBox[4];
		
		for(int i = 0; i < 4; i++)
			chkConstrains[i] = new CheckBox();
		
		//Eventos de los controles
		btnEliminar.addClickHandler(this);
		txtTipoDato.addKeyPressHandler(this);
		
		int i = this.getRowCount();
		
		this.setWidget(i, 0, btnEliminar);
		
		this.setWidget(i, 1, txtNombre);
		this.setWidget(i, 2, txtTipoDato);
		
		for(int j = 0; j < 4; j++)
			this.setWidget(i, j + 3, chkConstrains[j]);
		
		this.setWidget(i, 7, txtValDefct);
	}
	
	/**
	 * @param indice es el número del renglón de la tabla
	 * @return una columna para agregar a la tabla
	 */
	private TColumna generarColumna(int indice) {
		return controlador.generarColumna(indice, ((TextBox)this.getWidget(indice, 1)).getText(),
				((SuggestBox)this.getWidget(indice, 2)).getText(),
				((CheckBox)this.getWidget(indice, 3)).getValue(),
				((CheckBox)this.getWidget(indice, 4)).getValue(),
				((CheckBox)this.getWidget(indice, 5)).getValue(),
				((CheckBox)this.getWidget(indice, 6)).getValue(),
				((TextBox)this.getWidget(indice, 7)).getText());
	}
	
	/* (non-Javadoc)
	 * @see com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)
	 */
	public void onKeyPress(KeyPressEvent event) {
		SuggestBox e = (SuggestBox)event.getSource();
		int indice;
		
		for(indice = 1; indice < this.getRowCount(); indice++)
			if(e.equals((SuggestBox)this.getWidget(indice, 2)))
				break;
			
		if(indice == this.getRowCount() - 1 && 
				(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_TAB) && 
				controlador.datosValidos(((TextBox)this.getWidget(indice, 1)).getText(), ((SuggestBox)this.getWidget(indice, 2)).getText())) {
			//Agregar columna
			TColumna c = generarColumna(indice);
			controlador.getColumnas().add(c);
			controlador.actualizarLienzo();
			agregarUltimosControles();
		}
		else if((event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_TAB) && 
				controlador.datosValidos(((TextBox)this.getWidget(indice, 1)).getText(), ((SuggestBox)this.getWidget(indice, 2)).getText())) {
			//TODO: Mejorar esta validación para la modificación de los datos. Que no se repita el nombre más de una vez.
			//Modificar columna
			TColumna c = generarColumna(indice);
			
			c.setIdColumna(controlador.getColumnas().get(indice - 1).getIdColumna());
			c.setIdTabla(controlador.getColumnas().get(indice - 1).getIdTabla());
			controlador.getColumnas().set(indice - 1, c);
			controlador.actualizarLienzo();
		} else if(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER && 
				!controlador.datosValidos(((TextBox)this.getWidget(indice, 1)).getText(), 
				((SuggestBox)this.getWidget(indice, 2)).getText()))
			((TextBox)this.getWidget(indice, 1)).selectAll();
	}

	/* (non-Javadoc)
	 * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
	 */
	public void onClick(ClickEvent event) {
		PushButton e = (PushButton)event.getSource();
		int indice;
		
		for(indice = 1; indice < this.getRowCount(); indice++)
			if(e.equals(this.getWidget(indice, 0))){
				controlador.eliminarColumna(indice - 1);
				this.removeRow(indice);
				controlador.actualizarLienzo();
			}
		
		if(this.getRowCount() == 0)
			this.agregarUltimosControles();
	}

	/**
	 * @param columnas es el arreglo de columnas de la tabla a editar.
	 * Esta función agrega la información de las columnas de la tabla.
	 */
	public void setColumnas() {
		if(controlador.getColumnas() != null) {
			//Limpiar la tabla
			this.removeAllRows();
			colocarEtiquetas();
			agregarUltimosControles();
			
			for(int i = 0; i < controlador.getColumnas().size(); i++) {
				((TextBox)this.getWidget(i + 1, 1)).setText(controlador.getColumnas().get(i).getNombreCol());
				((SuggestBox)this.getWidget(i + 1, 2)).setText(controlador.getColumnas().get(i).getTipoDato());
				((CheckBox)this.getWidget(i + 1, 3)).setValue(controlador.getColumnas().get(i).getEsLlave());
				((CheckBox)this.getWidget(i + 1, 4)).setValue(controlador.getColumnas().get(i).getPermiteNulo());
				((CheckBox)this.getWidget(i + 1, 5)).setValue(controlador.getColumnas().get(i).getEsUnico());
				((CheckBox)this.getWidget(i + 1, 6)).setValue(controlador.getColumnas().get(i).getEsIndice());
				((TextBox)this.getWidget(i + 1, 7)).setText(controlador.getColumnas().get(i).getValDefault());
				
				agregarUltimosControles();
			}
		}
	}
}
